/**
 * @fileOverview Castle游戏事件类
 * @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
 * @version 0.0.1
 */

(function() {

	/** @exports _Class as Name.Sivory.Castle.Core.Event */
	var _Class =

	/**
	 * @class 游戏的事件类，托管游戏中事件的注册、触发等操作。
	 * @param {Name.Sivory.Castle.Core.Game} 游戏实例对象，参见{@link Name.Sivory.Castle.Core.Game}
	 * @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
	 * @version 0.0.1
	 */
	Name.Sivory.Castle.Core.Event = function(g) {

			/**
			 * @private
			 * @field
			 * @type Name.Sivory.Castle.Core.Game
			 * @description 游戏实例的引用
			 * @since 0.0.1
			 */
			this.game = g;

			/**
			 * @private
			 * @field
			 * @type Object
			 * @description 游戏事件列表的集合，它记录的是与事件相对应的索引以及此索引下的事件处理函数的列表。
			 * @since 0.0.1
			 */
			this.triggerArraySet = {};
		};

	/**
	 * @public
	 * @function
	 * @description 注册游戏事件
	 * @param {String} type 游戏事件的类型
	 * @param {Function(params)} handler 游戏事件的处理函数，将负责接收参数params，此参数中有事件的详细信息
	 * @since 0.0.1
	 */
	_Class.prototype.register = function(type, handler) {
		if(this.triggerArraySet[type] === null || this.triggerArraySet[type] === undefined) {
			this.triggerArraySet[type] = [];
		}
		this.triggerArraySet[type].push(handler);
	};

	/**
	 * @public
	 * @function
	 * @description 触发游戏事件
	 * @param {String} type 游戏事件的类型
	 * @param {String} sender 游戏事件的发送者
	 * @param {Object} params 游戏事件的详细参数
	 * @since 0.0.1
	 */
	_Class.prototype.trigger = function(type, sender, params) {
		params.gameIns = this.game;
		params.sender = sender;
		//遍历执行游戏事件处理函数
		if(this.triggerArraySet.hasOwnProperty(type)) {
			for(var i = 0; i < this.triggerArraySet[type].length; i++) {
				var handler = this.triggerArraySet[type][i];
				handler(params);
			}
		}
	};

	/**
	 * @public
	 * @function
	 * @description 清除游戏事件的处理函数
	 * @param {String} type 可选参数，将清除type类型事件中相应的处理函数。若留空，则会清除所有类型事件的所有处理函数。
	 * @param {Function} handler 可选参数，将清除事件中指定的处理函数。若留空，则会清除该事件下所有处理函数。
	 * @since 0.0.1
	 */
	_Class.prototype.clear = function(type, handler) {

		if(typeof type === "function" || type === null || type === undefined) {
			//清除所有事件的所有处理函数
			for(var index in this.triggerArraySet) {
				this.triggerArraySet[index].splice(0);
				delete this.triggerArraySet[index];
			}
		} else if(handler === null || handler === undefined) {
			//清除指定事件的所有处理函数
			if(this.triggerArraySet.hasOwnProperty(type) && typeof this.triggerArraySet[type].splice === "function") {
				this.triggerArraySet[type].splice(0);
			}
		} else {
			//清除指定事件的指定处理函数
			if(this.triggerArraySet.hasOwnProperty(type) && typeof this.triggerArraySet[type].splice === "function") {
				var index=0;
				for(var i = 0; i < this.triggerArraySet[type]; i++)
				if(this.triggerArraySet[type][i] === handler) {
					index=i;
					break;
				}
				this.triggerArraySet[type].splice(index,1);
			}
		}
	}
})();